package 每日一题;

/**
 * 318. 最大单词长度乘积
 * 给你一个字符串数组 words ，找出并返回 length(words[i]) * length(words[j]) 的最大值，并且这两个单词不含有公共字母。如果不存在这样的两个单词，返回 0 。
 *
 *
 *
 * 示例 1：
 *
 * 输入：words = ["abcw","baz","foo","bar","xtfn","abcdef"]
 * 输出：16
 * 解释：这两个单词为 "abcw", "xtfn"。
 * 示例 2：
 *
 * 输入：words = ["a","ab","abc","d","cd","bcd","abcd"]
 * 输出：4
 * 解释：这两个单词为 "ab", "cd"。
 * 示例 3：
 *
 * 输入：words = ["a","aa","aaa","aaaa"]
 * 输出：0
 * 解释：不存在这样的两个单词。
 *
 *
 * 提示：
 *
 * 2 <= words.length <= 1000
 * 1 <= words[i].length <= 1000
 * words[i] 仅包含小写字母
 */
public class D220708_T0318 {
    public int maxProduct(String[] words) {

        //将每个单词 转为26位二进制  存在为1 不存在为0 两个单词没有重复字母 按位与结果应该是0

        int max = 0;

        int[] hashInt = new int[words.length];

        for (int j = 0; j < words.length; j++) {

            for (int i = 0; i < words[j].length(); i++) {
                char c = words[j].charAt(i);
                hashInt[j] = hashInt[j] | (1 << (c - 'a')); //对用字母坐标 值为1
            }

        }


        for (int i = 0; i < hashInt.length; i++) {
            for (int j = 1 + 1; j < hashInt.length; j++) {
                if ((hashInt[i] & hashInt[j]) == 0) {
                    max = Math.max(words[i].length() * words[j].length(), max);
                }
            }
        }

        return max;

    }

    public static void main(String[] args) {
        D220708_T0318 d220708_t0318 = new D220708_T0318();
        d220708_t0318.maxProduct(new String[]{"abcw", "baz", "foo", "bar", "xtfn", "abcdef"});
    }
}
